package com.fengdi.book.easy;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MathProblem {
    public static class FizzBuzz {
        public List<String> fizzBuzz(int n) {
            ArrayList<String> list = new ArrayList<String>();

            for (int i = 1; i <= n; i++) {
                list.add(this.isFizzBuzz(i));
            }

            return list;
        }

        /**
         * @author FengDi
         * @description 同时是3和5的倍数一定是15的倍数，以为3和5都是质数
         * @param n 输入参数
         * @return 是否是FizzBuzz
         * @Date 2025/3/15
         * */
        private String isFizzBuzz(int n) {
            if(n % 15 == 0) return "FizzBuzz";
            if(n % 3 == 0) return "Fizz";
            if(n % 5 == 0) return "Buzz";
            return String.valueOf(n);
        }
    }

    public static class CountPrimes {

        public int countPrimes(int n) {
            boolean[] arr = new boolean[n];
            int cnt = 0;
            for(int i = 2; i < n; i++) {
                if(arr[i]) continue;
                cnt++;
                for(int j = i; j < n; j+=i) {
                    arr[j] = true;
                }
            }
            return cnt;
        }

    }

    public static class IsPowerOfThree {
        public boolean isPowerOfThree(int n) {
            if(n <= 0) return false;

            if(n > 1) {
                while(n % 3 == 0) {
                    n /= 3;
                }
            }

            return n == 1;
        }
    }

    public static class RomanToInt {
        public int romanToInt(String s) {
            Map<String, Integer> map = new HashMap<>();
            //所有可能的都列出来
            map.put("I", 1);
            map.put("IV", 4);
            map.put("V", 5);
            map.put("IX", 9);
            map.put("X", 10);
            map.put("XL", 40);
            map.put("L", 50);
            map.put("XC", 90);
            map.put("C", 100);
            map.put("CD", 400);
            map.put("D", 500);
            map.put("CM", 900);
            map.put("M", 1000);

            int result = 0;
            for(int i = 0; i < s.length();) {
                if(i + 1 < s.length() && map.containsKey(s.substring(i, i + 2))) {
                    result += map.get(s.substring(i, i + 2));
                    i += 2;
                }else {
                    result += map.get(s.substring(i, i + 1));
                    i++;
                }
            }

            return result;
        }
    }

    public static class HammingDistance {
        public int hammingDistance(int x, int y) {
            // xor运算
            int res = x ^ y;
            String str = Integer.toBinaryString(res);
            int distance = 0;
            for(int i = 0; i < str.length(); i++) {
                if(str.charAt(i) == '1') distance++;
            }

            return distance;
        }
    }

    public static class ReverseBits {
        public int reverseBits(int n) {
            int res = 0;
            for (int i = 0; i < 32; i++) {
                //res先往左移一位，把最后一个位置空出来，
                //用来存放n的最后一位数字
                res <<= 1;
                //res加上n的最后一位数字
                res |= n & 1;
                //n往右移一位，把最后一位数字去掉
                n >>= 1;
            }
            return res;
        }
    }
}
